package com.simplerobot.util;

import org.apache.log4j.Logger;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by superGay on 2015/11/17.
 */
public class DateUtil {
    public  static Logger log4j = Logger.getLogger(DateUtil.class);

    /**
     * 字符串转换成时间对象<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:13:00
     * @param time 字符串 时间
     * */
    public static Date parse(Object time){
        if(time == null){
            return null;
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat();
        try{
            return dateFormat.parse(com.simplerobot.util.SafeConvertUtil.toString(time));
        }catch (ParseException ex){
            ex.printStackTrace();
            log4j.error("DateUtil.parse error",ex);
            return null;
        }
    }

    /**
     * 字符串转换成时间对象<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:13:00
     *
     * @param time 字符串时间
     * @param format 格式化字符串，如：yyyy-MM-dd HH:mm:ss.SSS
     * */
    public static Date parse(Object time,String format){
        if(time == null ||time.toString().isEmpty()){
            return null;
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        try{
            return dateFormat.parse(com.simplerobot.util.SafeConvertUtil.toString(time));
        }catch (ParseException ex){
            log4j.error("DateUtil.parse error",ex);
            return null;
        }
    }

    /**
     * 时间对象转换成字符串<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:17:07
     *
     * @param time Date对象
     * @param format 格式化字符串，如：yyyy-MM-dd HH:mm:ss.SSS
     * */
    public static String formatToString(Date time,String format){
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        return dateFormat.format(time);
    }

    /**
     * 获取当前时间是那一周<br />
     * Author: heliu <br />
     * CreateTime: 2015/12/14 17:50
     *
     * @param time
     * @return
     */
    public static int getDayOfWeek(Date time)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);

        int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        if(week < 0)
        {
            week = 0;
        }

        return week;
    }

    /**
     * 获得日期年份<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:36:45
     *
     * @param time Calendar对象
     * @return int 日期年份
     * */
    public static int getYear(Calendar time){
        return time.get(Calendar.YEAR);
    }

    /**
     * 获得日期年份<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:37:32
     *
     * @param time Date对象
     * @return int 日期年份
     * */
    public static int getYear(Date time){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return getYear(calendar);
    }

    /**
     * 获得日期月份<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:39:06
     *
     * @param time Calendar对象
     * @return int 日期月份
     * */
    public static int getMonth(Calendar time){
        return time.get(Calendar.MONTH);
    }

    /**
     * 获得日期月份<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:39:31
     *
     * @param time Date对象
     * @return int 日期月份
     * */
    public static int getMonth(Date time){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return getMonth(calendar);
    }

    /**
     * 获得年份所对应的天<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:41:29
     *
     * @param time Calendar对象
     * @return int 年份所对应的天
     * */
    public static int getDayOfYear(Calendar time){
        return time.get(Calendar.DAY_OF_YEAR);
    }

    /**
     * 获得年份所对应的天<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:42:00
     *
     * @param time Date对象
     * @return int 年份所对应的天
     * */
    public static int getDayOfYear(Date time){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return getDayOfYear(calendar);
    }

    /**
     * 增加天<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:46:59
     *
     * @param time Calendar对象
     * @param days 要增加的天数
     * @return Calendar Calendar对象
     * */
    public static Calendar addDays(Calendar time,int days){
        time.set(Calendar.DAY_OF_YEAR, time.get(Calendar.DAY_OF_YEAR) + days);
        return time;
    }

    /**
     * 增加天<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:48:02
     *
     * @param time Date对象
     * @param minute 要增加的分钟数
     * @return Calendar Calendar对象
     * */
    public static Calendar addMinutes(Date time,int minute){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return addMinutes(calendar, minute);
    }

    /**
     * 增加分钟<br />
     * Author:superGay<br />
     * CreateTime:2016年3月28日10:32:37
     *
     * @param time Calendar对象
     * @param minute 要增加的分钟数
     * @return Calendar Calendar对象
     * */
    public static Calendar addMinutes(Calendar time,int minute){
        time.set(Calendar.MINUTE, time.get(Calendar.MINUTE) + minute);
        return time;
    }

    /**
     * 增加天<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:48:02
     *
     * @param time Date对象
     * @param days 要增加的天数
     * @return Calendar Calendar对象
     * */
    public static Calendar addDays(Date time,int days){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return addDays(calendar,days);
    }

    /**
     * 增加月<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:49:59
     *
     * @param time Calendar对象
     * @param months 要增加的月数
     * @return Calendar Calendar对象
     * */
    public static Calendar addMonths(Calendar time,int months){
        time.set(Calendar.MONTH, time.get(Calendar.MONTH) + months);
        return time;
    }

    /**
     * 增加月<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:50:14
     *
     * @param time Date对象
     * @param months 要增加的月数
     * @return Calendar Calendar对象
     * */
    public static Calendar addMonths(Date time,int months){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return addMonths(calendar,months);
    }

    /**
     * 增加年<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:52:00
     *
     * @param time Calendar对象
     * @param years 要增加的年数
     * @return Calendar Calendar对象
     * */
    public static Calendar addYears(Calendar time,int years){
        time.set(Calendar.YEAR,time.get(Calendar.YEAR)+years);
        return time;
    }

    /**
     * 增加年<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:52:13
     *
     * @param time Date对象
     * @param years 要增加的年数
     * @return Calendar Calendar对象
     * */
    public static Calendar addYears(Date time,int years){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return addYears(calendar,years);
    }

    /**
     * 获得月份所对应的天<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:41:29
     *
     * @param time Calendar对象
     * @return int 月份所对应的天
     * */
    public static int getDayOfMoney(Calendar time){
        return time.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获得月份所对应的天<br />
     * Author:superGay<br />
     * CreateTime:2015年11月17日16:42:00
     *
     * @param time Date对象
     * @return int 月份所对应的天
     * */
    public static int getDayOfMoney(Date time){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        return getDayOfYear(calendar);
    }

    /**
     * 获得两个时间的日期之差(date2-date1), 中间相隔的天数
     * @author  superGay
     * @time    2016/5/4 18:17
     * @param date1
     * @param date2
     * @return
     */
    public static long getDaysBetweenTwoDates(
            Date date1,
            Date date2
    ){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date1);
        calendar.set(Calendar.HOUR,         0);
        calendar.set(Calendar.MINUTE,       0);
        calendar.set(Calendar.SECOND,       0);
        calendar.set(Calendar.MILLISECOND,  0);
        long time1 = calendar.getTimeInMillis();

        calendar.setTime(date2);
        calendar.set(Calendar.HOUR,         0);
        calendar.set(Calendar.MINUTE,       0);
        calendar.set(Calendar.SECOND,       0);
        calendar.set(Calendar.MILLISECOND,  0);
        long time2 = calendar.getTimeInMillis();

        return (time2 - time1)/(1000 * 3600 * 24);
    }
}